package br.com.velp.sudecap.daoimpl;

import br.com.velp.sudecap.dao.EmpreendimentoDAO;
import br.com.velp.sudecap.dto.EmpreendimentoParametrosConsultaDTO;
import br.com.velp.sudecap.entidade.Empreendimento;
import br.com.velp.sudecap.entidade.Regional;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF003.01 - Listar Empreendimentos / RF003.02 - Cadastrar Empreendimentos </requisitos_afetados>
 * <descricao> Interface Responsável Pelas Operações de CRUD Referentes ao Contexto de Empreendimentos </descricao>
 * </sumario>
 */
@Repository("empreendimentoDAO")
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class EmpreendimentoDAOImpl implements EmpreendimentoDAO {

    public static final Long serialVersionUID = 1L;
    
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public List<Empreendimento> buscarEmpreendimentosPaginados(int firstResult, int maxResults,
	    EmpreendimentoParametrosConsultaDTO parametros, Order order) {

	Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Empreendimento.class);
	criteria.setFirstResult(firstResult);
	criteria.setMaxResults(maxResults);
	adicionarFiltrosConsulta(criteria, parametros);

	if (order != null) {
	    criteria.addOrder(order);
	} else {
	    criteria.addOrder(Order.asc("nome"));
	}

	return criteria.list();

    }

    @Override
    public int contarEmpreendimentos(EmpreendimentoParametrosConsultaDTO parametros) {
	Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Empreendimento.class);
	criteria.setProjection(Projections.rowCount());
	adicionarFiltrosConsulta(criteria, parametros);
	return ((Long) criteria.uniqueResult()).intValue();
    }

    @Override
    public Long salvar(Empreendimento value) {
	Long id = (Long) sessionFactory.getCurrentSession().save(value);
	sessionFactory.getCurrentSession().flush();
	return id;
    }

    @Override
    public void atualizar(Empreendimento value) {
	sessionFactory.getCurrentSession().update(value);
	sessionFactory.getCurrentSession().flush();
    }

    @Override
    public Empreendimento obterPorId(Long id) {
	return (Empreendimento) sessionFactory.getCurrentSession().get(Empreendimento.class, id);
    }

    @Override
    public void excluir(Empreendimento value) {
	sessionFactory.getCurrentSession().delete(value);
	sessionFactory.getCurrentSession().flush();
    }

    @Override
    public List<Regional> recuperarTodasRegionais() {
	return sessionFactory.getCurrentSession().createCriteria(Regional.class).addOrder(Order.asc("nome")).list();
    }

    private void adicionarFiltrosConsulta(Criteria criteria, EmpreendimentoParametrosConsultaDTO parametros) {
	if (parametros.getCodigoXPLAN() != null && !parametros.getCodigoXPLAN().isEmpty()) {
	    criteria.add(Restrictions.eq("codigoXplan", parametros.getCodigoXPLAN()));
	}
	if (parametros.getNome() != null && !parametros.getNome().isEmpty()) {
	    criteria.add(Restrictions.ilike("nome", parametros.getNome(), MatchMode.ANYWHERE));
	}
	if (parametros.getIdSituacao() != null && !parametros.getIdSituacao().isEmpty()) {
	    criteria.add(Restrictions.eq("situacao", parametros.getIdSituacao()));
	}
	if (parametros.getNumero() != null){
	    criteria.add(Restrictions.eq("id", parametros.getNumero()));
	}
    }
}
